package lol.clann.minecraft.springboot.api.bukkit.utils;

import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;

import java.io.File;
import java.util.List;
import java.util.Objects;

/**
 * @author pyz
 * @date 2018/7/22 下午6:53
 */

public interface ItemStackUtils {

    default public boolean isEmpty(ItemStack itemStack) {
        return itemStack == null || itemStack.getType() == Material.AIR || itemStack.getAmount() < 0;
    }

    File getItemStackDir();

    File getItemStacksDir();

    /**
     * BukkitItemStack转换成NMSItemStack
     *
     * @param itemStack
     * @param <T>
     * @return
     */
    <T> T toNMS(ItemStack itemStack);

    /**
     * CraftItemStack.asCraftCopy
     *
     * @param itemStack
     * @return
     */
    ItemStack asCraftCopy(ItemStack itemStack);

    /**
     * CraftItemStack.asNMSCopy
     *
     * @param itemStack
     * @param <T>
     * @return
     */
    <T> T asNMSCopy(ItemStack itemStack);

    /**
     * NMSItemStack转换成BukkitItemStack
     * @param nmsItemStack
     * @param <T>
     * @return
     */
    <T> ItemStack toBukkit(T nmsItemStack);

    /**
     * 复制物品
     *
     * @param itemStack
     * @return
     */
    ItemStack copy(ItemStack itemStack);

    /**
     * 序列化成NBTTagCompound
     * @param itemStack
     * @param <T>
     * @return
     */
    <T> T toNBTTagCompound(ItemStack itemStack);

    /**
     * 获取物品的NBTTagCompound
     *
     * @param itemStack
     * @param <T>
     * @return
     */
    <T> T getTag(ItemStack itemStack);

    /**
     * 获取物品的DisplayTag
     *
     * @param itemStack
     * @param <T>
     * @return
     */
    <T> T getDisplayTag(ItemStack itemStack);

    /**
     * 获取NBT,若不存在就创建
     *
     * @param itemStack
     * @param <T>
     * @return
     */
    <T> T getOrCreateTag(ItemStack itemStack);

    /**
     * 获取物品的DisplayTag
     * 说不存在就创建
     * @param itemStack
     * @param <T>
     * @return
     */
    <T> T getOrCreateDisplayTag(ItemStack itemStack);

    /**
     * 设置nbtTagCompound
     * @param itemStack
     * @param nbtTagCompound
     * @param <T>
     */
    <T> void setTag(ItemStack itemStack, T nbtTagCompound);

    /**
     * 就NBTTagCompound反序列化成物品
     * @param nbtTagCompound
     * @param <T>
     * @return
     */
    <T> ItemStack fromNBTTagCompound(T nbtTagCompound);

    String toJsonStringForRawMessage(ItemStack itemStack);

    void setUnbreakable(ItemStack itemStack, boolean unbreakable);

    boolean isUnbreakable(ItemStack itemStack);

    int getRepairCost(ItemStack itemStack);

    void setRepairCost(ItemStack itemStack, int repairCose);

    List<String> getLore(ItemStack itemStack);

    void setLore(ItemStack itemStack, List<String> lores);

    String getDisplayName(ItemStack itemStack);

    void setDisplayName(ItemStack itemStack, String name);

    /**
     * 用指定key将物品保存到文件
     *
     * @param itemStack
     * @param key
     */
    void save(ItemStack itemStack, String key);

    /**
     * 读取指定key的文件
     *
     * @param key
     * @return
     */
    ItemStack get(String key);

    /**
     * 用指定key将多个物品保存到文件
     *
     * @param itemStacks
     * @param key
     */
    void saves(List<ItemStack> itemStacks, String key);

    /**
     * 读取指定key的多个文件
     *
     * @param key
     */
    List<ItemStack> gets(String key);

    /**
     * 在不考虑数量的前提下,比较两个物品是否相同
     *
     * @param i1
     * @param i2
     * @return
     */
    default boolean equalsIgnoreCount(ItemStack i1, ItemStack i2) {
        if (i1 == i2) {
            return true;
        }
        if (i1 == null || i2 == null) {
            return false;
        }
        int c1 = i1.getAmount();
        int c2 = i2.getAmount();
        i1.setAmount(1);
        i2.setAmount(1);
        boolean eq = Objects.equals(i1, i2);
        i1.setAmount(c1);
        i2.setAmount(c2);
        return eq;
    }
}
